﻿using System;
using System.Net.Mail;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using Tibet.Logica;
using Tibet.Datos;

namespace PreCommitHook
{
    static class Program
    {

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Resultado result = new Resultado();
            Parser metodo = new Parser();

            if (FuncConsultarIdUsuario(args[0]) != 0)
                result = Tibet.Logica.Parser.ValidaArchivo(args[0], FuncConsultarIdProyecto(FuncConsultarIdUsuario(args[0])),
                                                           FuncConsultarIdUsuario(args[0]));
            
            if (result.Respuesta)
            {
                string correoUsuario = FuncConsultarCorreo(args[0]);

                EnviarCorreo(correoUsuario, "Commit Exitoso", Convert.ToString(result.Fecha));
                Environment.Exit(0);
            }
            else //En caso de que el archivo no cumpla con las reglas no se 
            {    //hace el commit y se manda correo al usuario
                string correoUsuario = FuncConsultarCorreo(args[0]);

                EnviarCorreo(correoUsuario, result.Linea, result.Mensaje, Convert.ToString(result.Fecha));
                Environment.Exit(1);
            }

        }

        /// <summary>
        /// Devuelve el id correspondiente de la base de datos del usuario registrado en el SVN
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        static public int FuncConsultarIdUsuario(string usuario)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELidUsuario.sql]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@usernameUsuario", usuario);
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    int strUsuario = Convert.ToUInt16(reader.GetValue(0));
                    return strUsuario;
                }

                reader.Close();
                bd.CerrarConexionBd();
                return 0;
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return 0;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return 0;
            }
        }

        /// <summary>
        /// devuelve el id del proyecto al que pertenece el usuario
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        static public int FuncConsultarIdProyecto(int idUsuario)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELidProyecto.sql]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idUsuario", idUsuario);
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    int strUsuario = Convert.ToUInt16(reader.GetValue(0));
                    return strUsuario;
                }

                reader.Close();
                bd.CerrarConexionBd();
                return 0;
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return 0;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return 0;
            }
        }

        /// <summary>
        /// Inicializa un Objeto de tipo Conexion
        /// </summary>
        /// <returns>Objeto Conexion Inicializado</returns>
        static private Conexion InstanciarConexion()
        {
            Conexion conexion = new Conexion();
            return (conexion);
        }

        /// <summary>
        /// Devuelve el correo del usuario
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        static public string FuncConsultarCorreo(string usuario)
        {
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELCorreoElectronico.sql]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@usernameUsuario", usuario);
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    string strUsuario = Convert.ToString(reader.GetValue(0));
                    return strUsuario;
                }

                reader.Close();
                bd.CerrarConexionBd();
                return "Error";
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return "Error";
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return "Error";
            }
        }

        /// <summary>
        /// Envia un correo al usuario pasado por parametro
        /// en caso de que exista un error o incumplimento
        /// de alguna de las reglas
        /// </summary>
        /// <param name="CorreoUsuario"></param>
        static public void EnviarCorreo(string CorreoUsuario, int Linea, string Mensaje, string Fecha)
        {
            //La cadena "servidor" es el servidor de correo que enviará tu mensaje
            string servidor = "un.servidor.smtp.válido";
            string msj = "Error: \n" +
                         " Linea: " + Linea + "\n" +
                         Mensaje;

            MailMessage mensaje = new MailMessage(
               "admin@tibet.com",
               CorreoUsuario,
               "Error Reglas",
                msj);

            //Envía el mensaje.
            SmtpClient cliente = new SmtpClient(servidor);
            //Añade credenciales si el servidor lo requiere.
            //cliente.Credentials = CredentialCache.DefaultNetworkCredentials;
            cliente.Send(mensaje);
        }

        /// <summary>
        /// Envia correo al usuario con los datos pasados por parametro
        /// </summary>
        /// <param name="CorreoUsuario"></param>
        /// <param name="Mensaje"></param>
        /// <param name="Fecha"></param>
        static public void EnviarCorreo(string CorreoUsuario, string Mensaje, string Fecha)
        {
            //La cadena "servidor" es el servidor de correo que enviará tu mensaje
            string servidor = "un.servidor.smtp.válido";
            string msj = Mensaje;

            MailMessage mensaje = new MailMessage(
               "admin@tibet.com",
               CorreoUsuario,
               "Commit",
                msj);

            //Envía el mensaje.
            SmtpClient cliente = new SmtpClient(servidor);
            //Añade credenciales si el servidor lo requiere.
            //cliente.Credentials = CredentialCache.DefaultNetworkCredentials;
            cliente.Send(mensaje);
        }

    }
}
